import parseAttrsString from './parseAttrsString'

export default function (templateString) {
  // 指针
  var index = 0
  // 模板字符串剩余部分
  var rest = ''
  // 开始标签正则
  var startRegExp = /^\<([a-z]+[1-6]?)(\s[^\<]+)?\>/
  // 结束标签正则
  var endRegExp = /^\<\/([a-z]+[1-6]?)\>/
  // 抓取结束标签前的文字正则 ^既有开头又有非得意思，这里暂时只考虑了开始标签和结束标签之间的文字，没有考虑结束标签与开始标签之间的文字
  var wordRegExp = /^([^\<]+)\<\/[a-z]+[1-6]?\>/
  // 准备俩个栈,stack1存开始标签，stack2存占位数组和内容
  var stack1 = []
  var stack2 = [{ children: [] }]

  while (index < templateString.length - 1) {
    rest = templateString.substring(index)
    // 识别遍历到的这个字符串，是不是一个开始标签
    if (startRegExp.test(rest)) {
      // 标签
      let tag = rest.match(startRegExp)[1]
      // 属性字符串
      let attrsString = rest.match(startRegExp)[2]
      console.log('检测到开始标签：', tag)
      console.log('检测到开始标签的属性：', attrsString)
      // 将开始标签推入栈中
      stack1.push(tag)
      // 将tag和children数组推到stack2中
      stack2.push({
        tag: tag,
        children: [],
        attrs: parseAttrsString(attrsString),
      })
      // 指针移动标签的长度加2再加上属性的长度，因为<>也占两位，
      const attrsStringLength =
        attrsString !== undefined ? attrsString.length : 0
      index += tag.length + 2 + attrsStringLength
    } else if (endRegExp.test(rest)) {
      // 识别遍历到的这个字符串，是不是一个结束标签
      let tag = rest.match(endRegExp)[1]
      // console.log('检测到结束标签：', tag)
      let pop_tag = stack1.pop()
      // 弹出来的标签跟结束标签是否一样
      if (tag === pop_tag) {
        let pop_arr = stack2.pop()
        if (stack2.length > 0) {
          stack2[stack2.length - 1].children.push(pop_arr)
        }
      } else {
        throw new Error(pop_tag + '标签没有封闭！！')
      }
      index += tag.length + 3
    } else if (wordRegExp.test(rest)) {
      // 识别遍历到这个字符串，是不是文字
      let word = rest.match(wordRegExp)[1]

      // 检查文字（word）是不是全是空
      if (!/^\s+$/.test(word)) {
        // 不是全是空
        // console.log("检测到文字：",word);
        // 改变此时stack2栈顶元素，将{text:word,type: 3}对象推入到栈顶元素的children中
        stack2[stack2.length - 1].children.push({ text: word, type: 3 })
      }

      index += word.length
    } else {
      // 标签中的文字
      index++
    }
  }

  // 此时stack2就是我们之前默认放置的一项了，此时要返回这一项的children的第一项即可(因为vue2要求只有一个父标签)
  return stack2[0].children[0]
}
